package cn.zhukelili.expand;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @description:
 * @author: hhbeast
 * @since: 2018/7/29 14:39
 */
public class Client {
    public static void main(String[] args) throws IOException {
        System.out.println("-------H1型号悍马--------");
        System.out.println("H1型号的悍马是否需要喇叭声响？0-不需要 1-需要");
        String type = (new BufferedReader(new InputStreamReader(System.in))).readLine();
        HummerH1Model h1 = new HummerH1Model();
        if (type.equals("0")) {
            h1.setAlarm(false);
        }
        h1.run();
        System.out.println("\n-------H2型号悍马--------");
        HummerH2Model h2 = new HummerH2Model();
        h2.run();
    }
}

/*
看到没，H1型号的悍马是由客户自己控制是否要响喇叭，也就是说外界条件改变，影
响到模板方法的执行。在我们的抽象类中isAlarm的返回值就是影响了模板方法的执行结
果，该方法就叫做钩子方法（Hook Method）。有了钩子方法模板方法模式才算完美，大家
可以想想，由子类的一个方法返回值决定公共部分的执行结果，是不是很有吸引力呀！
模板方法模式就是在模板方法中按照一定的规则和顺序调用基本方法，具体到前面那个
例子，就是run()方法按照规定的顺序（先调用start()，然后再调用engineBoom()，再调用
alarm()，最后调用stop()）调用本类的其他方法，并且由isAlarm()方法的返回值确定run()中的
执行顺序变更。
 */
